package jsu.ljy.lostandfind.service.impl;

import jsu.ljy.lostandfind.dao.impl.ClaimInfoDaoImpl;
import jsu.ljy.lostandfind.dao.impl.CommentDaoImpl;
import jsu.ljy.lostandfind.dao.impl.ItemDaoImpl;
import jsu.ljy.lostandfind.model.ClaimInfo;
import jsu.ljy.lostandfind.model.Comment;
import jsu.ljy.lostandfind.model.Item;
import jsu.ljy.lostandfind.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 物品服务实现类
 * 
 * <p>实现了物品相关的业务逻辑，包括物品的发布、查询、更新、删除等功能。
 * 提供了物品状态管理和搜索的核心实现。</p>
 * 
 * @author 罗嘉毅
 * @version 1.0
 * @since 2024-03-21
 */
@Service
public class ItemServiceImpl implements ItemService {
    private final ItemDaoImpl itemDao;
    private final ClaimInfoDaoImpl claimInfoDao;
    private final CommentDaoImpl commentDao;

    /**
     * 构造函数，注入依赖的DAO组件
     * 
     * @param itemDao ���品数据访问对象
     * @param claimInfoDao 认领信息数据访问对象
     * @param commentDao 评论数据访问对象
     */
    @Autowired
    public ItemServiceImpl(ItemDaoImpl itemDao, ClaimInfoDaoImpl claimInfoDao, CommentDaoImpl commentDao) {
        this.itemDao = itemDao;
        this.claimInfoDao = claimInfoDao;
        this.commentDao = commentDao;
    }

    /**
     * 发布物品信息
     * 
     * @param item 物品信息
     * @throws IllegalArgumentException 当物品信息不完整时抛出
     */
    @Override
    public Item publishItem(Item item) {
        validateItemInfo(item);
        
        if (item.getId() == null) {
            item.setId(System.currentTimeMillis());
        }
        
        if (item.getCreateTime() == null) {
            item.setCreateTime(new Date());
        }
        
        itemDao.save(item);
        
        return itemDao.findById(item.getId());
    }

    /**
     * 更新物品信息
     * 
     * @param item 更新的物品信息
     * @throws IllegalArgumentException 当物品ID为空或物品不存在时抛出
     */
    @Override
    public void updateItem(Item item) {
        if (item.getId() == null) {
            throw new IllegalArgumentException("物品ID不能为空");
        }
        validateItemInfo(item);
        itemDao.update(item);
    }

    /**
     * 删除物品及其相关信息
     * 
     * @param id 物品ID
     * @throws IllegalArgumentException 当ID为空或物品不存在时抛出
     */
    @Override
    public void deleteItem(Long id) {
        if (id == null) {
            throw new IllegalArgumentException("物品ID不能为空");
        }
        itemDao.delete(id);
    }

    /**
     * 根据ID查询物品
     * 
     * @param id 物品ID
     * @return 物品信息，不存在时返回null
     * @throws IllegalArgumentException 当ID为空时抛出
     */
    @Override
    public Item getItemById(Long id) {
        if (id == null) {
            throw new IllegalArgumentException("物品ID不能为空");
        }
        return itemDao.findById(id);
    }

    /**
     * 获取所有物品
     * 
     * @return 物品列表，按创建时降序排序
     */
    @Override
    public List<Item> getAllItems() {
        return itemDao.findAll();
    }

    /**
     * 根据状态查询物品
     * 
     * @param status 物品状态
     * @return 符合状态的物品列表
     * @throws IllegalArgumentException 当状态无效时抛出
     */
    @Override
    public List<Item> getItemsByStatus(String status) {
        validateItemStatus(status);
        return itemDao.findAll().stream()
                .filter(item -> status.equals(item.getStatus()))
                .collect(Collectors.toList());
    }

    /**
     * 搜索物品
     * 
     * @param keyword 搜索关键词
     * @return 匹配的物品列表
     */
    @Override
    public List<Item> searchItems(String keyword) {
        if (keyword == null || keyword.trim().isEmpty()) {
            return getAllItems();
        }
        return itemDao.findAll().stream()
                .filter(item -> matchesKeyword(item, keyword.toLowerCase()))
                .collect(Collectors.toList());
    }

    /**
     * 验证物品信息
     * 
     * @param item 物品信息
     * @throws IllegalArgumentException 当物品信息不完整或无效时抛出
     */
    private void validateItemInfo(Item item) {
        if (item.getName() == null || item.getName().trim().isEmpty()) {
            throw new IllegalArgumentException("物品名称不能为空");
        }
        if (item.getLocation() == null || item.getLocation().trim().isEmpty()) {
            throw new IllegalArgumentException("地点不能为空");
        }
        validateItemStatus(item.getStatus());
    }

    /**
     * 验证物品状态
     * 
     * @param status 物品状态
     * @throws IllegalArgumentException 当状态无效时抛出
     */
    private void validateItemStatus(String status) {
        if (status == null || status.trim().isEmpty()) {
            throw new IllegalArgumentException("物品状态不能为空");
        }
        if (!Arrays.asList("LOST", "FOUND", "PENDING_CLAIM", "CLAIMED").contains(status)) {
            throw new IllegalArgumentException("无效的物品状态");
        }
    }

    /**
     * 检查物品是否匹配关键词
     * 
     * @param item 物品信息
     * @param keyword 关键词（小写）
     * @return 是否匹配
     */
    private boolean matchesKeyword(Item item, String keyword) {
        return (item.getName() != null && item.getName().toLowerCase().contains(keyword)) ||
               (item.getDescription() != null && item.getDescription().toLowerCase().contains(keyword)) ||
               (item.getLocation() != null && item.getLocation().toLowerCase().contains(keyword));
    }
} 